Welcome to Hands on deep learning!

02.03.06 降维

我们可以对任意张量进行的一个有用的操作是计算其元素的和。 数学表示法使用符号 表示求和。 为了表示长度为d的向量中元素的总和,可以记为

。 在代码中可以调用计算求和的函数:

import torch

x = torch.arange(4, dtype=torch.float32)

print(x)

print(x.sum())

返回值:

tensor([0., 1., 2., 3.])

tensor(6.)

我们可以表示任意形状张量的元素和。 例如,矩阵中元素的和可以记为

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)

print(A)

print(A.shape)

print(A.sum())

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.],

[12., 13., 14., 15.],

[16., 17., 18., 19.]])

torch.Size([5, 4])

tensor(190.)

默认情况下,调用求和函数会沿所有的轴降低张量的维度,使它变为一个标量。 我们还可以指定张量沿哪一个轴来通过求和降低维度。 以矩阵为例,为了通过求和所有行的元素来降维(轴0),可以在调用函数时指定axis=0。 由于输入矩阵沿0轴降维以生成输出向量,因此输入轴0的维数在输出形状中消失。

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)

print(A)

A_sum_axis0 = A.sum(axis=0)

print(A_sum_axis0)

print(A_sum_axis0.shape)

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.],

[12., 13., 14., 15.],

[16., 17., 18., 19.]])

tensor([40., 45., 50., 55.])

torch.Size([4])

指定axis=1将通过汇总所有列的元素降维(轴1)。因此,输入轴1的维数在输出形状中消失。

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)

print(A)

A_sum_axis1 = A.sum(axis=1)

print(A_sum_axis1)

print(A_sum_axis1.shape)

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.],

[12., 13., 14., 15.],

[16., 17., 18., 19.]])

tensor([ 6., 22., 38., 54., 70.])

torch.Size([5])

沿着行和列对矩阵求和,等价于对矩阵的所有元素进行求和。

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)

print(A)

B=A.sum(axis=[0, 1]) # 结果和A.sum()相同

print(B)

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.],

[12., 13., 14., 15.],

[16., 17., 18., 19.]])

tensor(190.)

一个与求和相关的量是平均值(mean或average)。 我们通过将总和除以元素总数来计算平均值。 在代码中,我们可以调用函数来计算任意形状张量的平均值。

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)

print(A)

B=A.mean(), A.numel(),A.sum() / A.numel()

print(B)

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.],

[12., 13., 14., 15.],

[16., 17., 18., 19.]])

(tensor(9.5000), 20, tensor(9.5000))

同样,计算平均值的函数也可以沿指定轴降低张量的维度。

import torch

A = torch.arange(20, dtype=torch.float32).reshape(5, 4)

print(A)

B=A.sum(axis=0), A.shape[0],A.sum(axis=0) / A.shape[0]

print(B)

返回值:

tensor([[ 0., 1., 2., 3.],

[ 4., 5., 6., 7.],

[ 8., 9., 10., 11.],

[12., 13., 14., 15.],

[16., 17., 18., 19.]])

(tensor([40., 45., 50., 55.]), 5, tensor([ 8., 9., 10., 11.]))